#include "notacompas.h"
#include "formato.h"
#include "asistenteXml.h"
#include "matematicas.h"

NotaCompas::NotaCompas()
{
	//nota = -1;
	pulso = 0;
	division = 0;
	divisiones = 0;
}

NotaCompas::NotaCompas(QString nombreNota, int pulso, int division, int divisiones)
{
	this->nombreNota = nombreNota;
	this->pulso = pulso;
	this->division = division;
	this->divisiones = divisiones;
}

NotaCompas::~NotaCompas()
{

}

bool NotaCompas::esValida() const
{
	return divisiones > 0;
}   

bool NotaCompas::operator<(const NotaCompas& otra) const
{
   return distanciaHasta(otra) > 0;
}

double NotaCompas::distanciaHasta(const NotaCompas& otra) const
{
    if (!esValida() || !otra.esValida()) {
        return 0;
    }
    
    double fraccion = pulso + ((double) division) / divisiones;
    double otraFraccion = otra.pulso + ((double) otra.division) / otra.divisiones;

    return otraFraccion - fraccion;
}

QVariant NotaCompas::get(const QString& nombreAtributo) const
{
	GET_ATR(getNombreNota())
	GET_ATR(getTextoPosicion())
    GET_DEF
}

int NotaCompas::getAncho(const QString& nombreAtributo) const
{
    ANCHO_ATR(getNombreNota(), 100)
    ANCHO_ATR(getTextoPosicion(), 100)
    ANCHO_DEF
}

void NotaCompas::serializar(QDomElement& elemento) const
{
    AsistenteXml asistente(elemento.ownerDocument());

	asistente.escribirAtributo(elemento, "nota", nombreNota);
    QString textoPosicion = formatearPosicion();
    asistente.escribirAtributo(elemento, "posicion", textoPosicion);
}

void NotaCompas::deserializar(const QDomElement& elemento)
{
    AsistenteXml asistente(elemento.ownerDocument());

    nombreNota = asistente.leerAtributo(elemento, "nota");
    QString textoPosicion  = asistente.leerAtributo(elemento, "posicion");
    parsearPosicion(textoPosicion);
}


QString NotaCompas::formatearPosicion() const
{
    return QString("%1.%2/%3").arg(pulso + 1).arg(division + 1).arg(divisiones);
}

void NotaCompas::parsearPosicion(const QString& posicion)
{
    pulso = 0;
    division = 0;
    divisiones = 1;
    QStringList lista = posicion.split(".");

    if (lista.size() >= 1) {
        pulso = lista.at(0).toInt() - 1;
    }
    if (lista.size() >= 2) {
        QStringList sublista = lista.at(1).split("/");
        if (sublista.size() >= 1) {
            division = sublista.at(0).toInt() - 1;
        }
        if (sublista.size() >= 2) {
            divisiones = sublista.at(1).toInt();
        }
    }

    normalizarPosicion();
}

void NotaCompas::normalizarPosicion()
{
    if (pulso < 0) {
        pulso = 0;
    }
    if (divisiones <= 0) {
        divisiones = 1;
    }
    if (division < 0) {
        division = 0;
    }
    if (division > divisiones) {
        division = divisiones;
    }
}
